/*
* Copyright (c) 2010-2011 Gösta Jonasson. All Rights Reserved.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package st.brothas.mtgoxwidget;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import java.util.List;
/**
* Represents the graph that shows the ticker data change in time.
*/
public class GraphPopupActivity extends ActionBarActivity {
private enum GraphTimeframe {OneDay("day", 1, "HH:mm"), OneWeek("week", 7, "MM-dd");
public final String description;
public final int days;
public String timeFormat;
GraphTimeframe(String description, int days, String timeFormat) {
this.description = description;
this.days = days;
this.timeFormat = timeFormat;
}
}
private GraphicalView chartView;
private XYMultipleSeriesDataset dataset;
private XYMultipleSeriesRenderer renderer;
// private XYSeries currentSeries;
// private XYSeriesRenderer currentRenderer;
private static final long PADDING_MS = 15*60*1000; // Add 15 minutes to each side of the graph
private static final long ONE_DAY_IN_MS = 24*60*60*1000; // 24 hours
private boolean emptyChart = false;
private int appWidgetId;
private GraphTimeframe graphTimeframe = GraphTimeframe.OneDay;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
appWidgetId = getIntent().getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
showGraphPopup();
}
private void showGraphPopup() {
MtGoxDataOpenHelper db = new MtGoxDataOpenHelper(this);
WidgetPreferences preferences = MtGoxPreferencesActivity.getWidgetPreferences(this, appWidgetId);
List<MtGoxTickerData> tickerData = db.getTickerData(System.currentTimeMillis() -
(ONE_DAY_IN_MS * graphTimeframe.days), preferences);
if (tickerData.size() > 0) {
setupChart(tickerData);
emptyChart = false;
} else {
emptyChart = true;
}
setTitle(preferences.getRateService().getName() + " " +
preferences.getCurrencyConversion().description + " - Last " + graphTimeframe.description);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND,
WindowManager.LayoutParams.FLAG_DIM_BEHIND);
setContentView(R.layout.popup_graph_layout);
}
private void setupChart(List<MtGoxTickerData> dataList) {
dataset = new XYMultipleSeriesDataset();
renderer = initChart();
XYSeries highSeries = addSeries(getString(R.string.high), Color.parseColor("#00CC00"), false);
XYSeries lowSeries = addSeries(getString(R.string.low), Color.parseColor("#CC0000"), false);
XYSeries sellSeries = addSeries(getString(R.string.sell), Color.parseColor("#AAFFAA"), false);
XYSeries buySeries = addSeries(getString(R.string.buy), Color.parseColor("#FFAAAA"), false);
XYSeries lastSeries = addSeries(getString(R.string.last), Color.WHITE, true);
for (MtGoxTickerData data : dataList) {
//Log.d("Graphdata", data.toString());
addDataToSeriesIfNotNull(highSeries, data.getTimestamp().getTime(), data.getHigh());
addDataToSeriesIfNotNull(lowSeries, data.getTimestamp().getTime(), data.getLow());
addDataToSeriesIfNotNull(sellSeries, data.getTimestamp().getTime(), data.getSell());
addDataToSeriesIfNotNull(buySeries, data.getTimestamp().getTime(), data.getBuy());
addDataToSeriesIfNotNull(lastSeries, data.getTimestamp().getTime(), data.getLast());
}
}
private void addDataToSeriesIfNotNull(XYSeries series, long time, Double value) {
if (value != null && value > 0) {
series.add(time, value);
}
}
private XYSeries addSeries(String title, int color, boolean mainLine) {
prepareSeries(color, mainLine);
XYSeries series = new XYSeries(title);
dataset.addSeries(series);
return series;
}
private XYMultipleSeriesRenderer initChart() {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
renderer.setXLabels(8);
renderer.setYLabels(12);
renderer.setXTitle("");
renderer.setYTitle("Value"); // TODO: Change to something else
renderer.setShowGrid(true);
renderer.setXAxisMin(System.currentTimeMillis() - (ONE_DAY_IN_MS * graphTimeframe.days) - PADDING_MS);
renderer.setXAxisMax(System.currentTimeMillis() + PADDING_MS);
renderer.setAxisTitleTextSize(20);
renderer.setChartTitleTextSize(20);
renderer.setLegendTextSize(20);
renderer.setLabelsTextSize(22);
renderer.setFitLegend(true);
return renderer;
}
private XYSeriesRenderer prepareSeries(int color, boolean mainLine) {
XYSeriesRenderer seriesRenderer = new XYSeriesRenderer();
seriesRenderer.setColor(color);
if (mainLine) {
//seriesRenderer.setPointStyle(PointStyle.CIRCLE);
//seriesRenderer.setFillPoints(true);
seriesRenderer.setLineWidth(2);
} else {
seriesRenderer.setLineWidth(1);
}
renderer.addSeriesRenderer(seriesRenderer);
return seriesRenderer;
}
@Override
protected void onResume() {
super.onResume();
// if (chartView == null) {
LinearLayout layout = (LinearLayout) findViewById(R.id.chart);
if (emptyChart) {
TextView tview = new TextView(this);
tview.setText(R.string.empty_graph);
layout.addView(tview, new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
} else {
chartView = ChartFactory.getTimeChartView(this, dataset, renderer, graphTimeframe.timeFormat);
layout.addView(chartView, new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
}
// } else if (chartView != null) {
// chartView.repaint();
// }
}
// @Override
// protected void onRestoreInstanceState(Bundle savedState) {
// super.onRestoreInstanceState(savedState);
// dataset = (XYMultipleSeriesDataset) savedState.getSerializable("dataset");
// renderer = (XYMultipleSeriesRenderer) savedState.getSerializable("renderer");
// currentSeries = (XYSeries) savedState.getSerializable("current_series");
// currentRenderer = (XYSeriesRenderer) savedState.getSerializable("current_renderer");
// }
//
// @Override
// protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
// outState.putSerializable("dataset", dataset);
// outState.putSerializable("renderer", renderer);
// outState.putSerializable("current_series", currentSeries);
// outState.putSerializable("current_renderer", currentRenderer);
// }
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
if(graphTimeframe.equals(GraphTimeframe.OneDay)) {
menu.findItem(R.id.switchTimeframe).setTitle("Show last " + GraphTimeframe.OneWeek.description);
menu.findItem(R.id.switchTimeframe).setIcon(R.drawable.ic_menu_week);
} else {
menu.findItem(R.id.switchTimeframe).setTitle("Show last " + GraphTimeframe.OneDay.description);
menu.findItem(R.id.switchTimeframe).setIcon(R.drawable.ic_menu_day);
}
return super.onPrepareOptionsMenu(menu);
}
// http://developer.android.com/guide/topics/ui/menus.html
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.graph_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.refreshMenu:
finish();
String toastText = "Refreshing rate from " +
MtGoxPreferencesActivity.getWidgetPreferences(this, appWidgetId).getRateService().getName()+ "...";
Toast.makeText(this, toastText, Toast.LENGTH_LONG).show();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
MtGoxWidgetProvider.updateAppWidgetAsync(this, appWidgetManager, appWidgetId);
return true;
case R.id.switchTimeframe:
if(graphTimeframe.equals(GraphTimeframe.OneDay)) {
graphTimeframe = GraphTimeframe.OneWeek;
} else {
graphTimeframe = GraphTimeframe.OneDay;
}
showGraphPopup();
onResume();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}